package ru.samgtu.wst;

import java.io.IOException;
import java.util.logging.ConsoleHandler;
import java.util.logging.Handler;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.SwingUtilities;

import ru.samgtu.wst.model.Preferences;
import ru.samgtu.wst.plugin.Framework;
import ru.samgtu.wst.plugin.fuzz.Fuzzer;
import ru.samgtu.wst.plugin.fuzz.swing.FuzzerPanel;
import ru.samgtu.wst.plugin.manualrequest.ManualRequest;
import ru.samgtu.wst.plugin.manualrequest.swing.ManualRequestPanel;
import ru.samgtu.wst.plugin.proxy.BrowserCache;
import ru.samgtu.wst.plugin.proxy.CookieTracker;
import ru.samgtu.wst.plugin.proxy.ManualEdit;
import ru.samgtu.wst.plugin.proxy.Proxy;
import ru.samgtu.wst.plugin.proxy.RevealHidden;
import ru.samgtu.wst.plugin.proxy.swing.ManualEditPanel;
import ru.samgtu.wst.plugin.proxy.swing.MiscPanel;
import ru.samgtu.wst.plugin.proxy.swing.ProxyPanel;
import ru.samgtu.wst.plugin.spider.Spider;
import ru.samgtu.wst.plugin.spider.swing.SpiderPanel;
import ru.samgtu.wst.plugin.sqlinj.SqlInjection;
import ru.samgtu.wst.plugin.sqlinj.swing.SqlInjectionPanel;
import ru.samgtu.wst.plugin.xss.XSS;
import ru.samgtu.wst.plugin.xss.swing.XSSPanel;
import ru.samgtu.wst.ui.swing.UIFramework;
import ru.samgtu.wst.util.TextFormatter;
import ru.samgtu.wst.util.swing.ExceptionHandler;

public class Main {

	private Main() {
	}

	
	public static void main(String[] args) {

		System.setProperty("sun.awt.exception.handler", ExceptionHandler.class
				.getName());

		initLogging();

		try {
			Preferences.loadPreferences(null);
		} catch (IOException ioe) {
			System.err.println("Error loading preferences: " + ioe);
			System.exit(1);
		}

		Framework framework = new Framework();

		boolean lite = Boolean.valueOf(
				Preferences.getPreference("WST.lite", "true"))
				.booleanValue();

		if ((args != null) && (args.length > 0)) {
			if (args[0].equalsIgnoreCase("lite")) {
				lite = true;
				if (args.length > 1) {
					String[] trim = new String[args.length - 1];
					System.arraycopy(args, 1, trim, 0, args.length - 1);
					args = trim;
				} else {
					args = new String[0];
				}
			}
		}

		final UIFramework uif = new UIFramework(framework);
		ExceptionHandler.setParentComponent(uif);
		loadAllPlugins(framework, uif);
		try {
			SwingUtilities.invokeAndWait(new Runnable() {
				public void run() {
					uif.setVisible(true);
					uif.toFront();
					uif.requestFocus();
					// splash.close();
				}
			});
		} catch (Exception e) {
			System.err.println("Error loading GUI: " + e.getMessage());
			System.exit(1);
		}
		uif.run();

		try {
			Preferences.savePreferences();
		} catch (IOException ioe) {
			System.err.println("Could not save preferences: " + ioe);
		}
		System.exit(0);
	}

	private static void initLogging() {
		Logger logger = Logger.getLogger("ru.samgtu.wst");
		logger.setUseParentHandlers(false);
		Handler ch = new ConsoleHandler();
		ch.setFormatter(new TextFormatter());
		logger.addHandler(ch);
		ch.setLevel(Level.FINE);
	}

	public static void loadAllPlugins(Framework framework, UIFramework uif) {
		Proxy proxy = new Proxy(framework);
		framework.addPlugin(proxy);
		ProxyPanel proxyPanel = new ProxyPanel(proxy);
		uif.addPlugin(proxyPanel);

		ManualEdit me = new ManualEdit(framework);
		proxy.addPlugin(me);
		proxyPanel.addPlugin(new ManualEditPanel(me));

		RevealHidden rh = new RevealHidden();
		proxy.addPlugin(rh);
		BrowserCache bc = new BrowserCache();
		proxy.addPlugin(bc);
		CookieTracker ct = new CookieTracker(framework);
		proxy.addPlugin(ct);
		proxyPanel.addPlugin(new MiscPanel(rh, bc, ct));

		ManualRequest manualRequest = new ManualRequest(framework);
		framework.addPlugin(manualRequest);
		uif.addPlugin(new ManualRequestPanel(manualRequest));

		Spider spider = new Spider(framework);
		framework.addPlugin(spider);
		uif.addPlugin(new SpiderPanel(spider));

		XSS xss = new XSS(framework);
		framework.addPlugin(xss);
		uif.addPlugin(new XSSPanel(xss));
		
		SqlInjection sqlinj=new SqlInjection(framework);
		framework.addPlugin(sqlinj);
		uif.addPlugin(new SqlInjectionPanel(sqlinj));
		/*
		Fuzzer fuzzer = new Fuzzer(framework);
		framework.addPlugin(fuzzer);
		FuzzerPanel fuzzerPanel = new FuzzerPanel(fuzzer);
		uif.addPlugin(fuzzerPanel);
		*/
	}

}
